package com.sojson.annotation.aspect;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;

import com.sojson.config.exception.TransErrorCode;
import com.sojson.config.exception.TransException;
import com.sojson.constant.ConstantServlet;
import com.sojson.util.token.Token;
import com.sojson.util.token.TokenUtil;

/**
 * 判断同一个帐号是否在多地登录切面(只判断已经登录的用户,没有登录直接过)
 * 
 * @author liu
 * @date 2021-05-18
 */
// @Aspect
// @Component
public class KickoutAspect {

    /** 配置织入点 */
    @Pointcut("@annotation(" + ConstantServlet.PACKAGE_DEFAULT_ANNOTATION_ALL + ".Kickout)")
    public void pointCut() {}

    /** 切点 */
    private static final String POINTCUT = "pointCut()";

    /**
     * 请求处理之前
     * 
     * @param jp 切点
     * @throws Throwable
     */
    @Before(POINTCUT)
    public boolean before(JoinPoint jp) throws Throwable {
        // =========================================================================================================
        // =============================================如果用户未登录就通过=============================================
        // =========================================================================================================
        Token token = TokenUtil.getToken();
        if (!TokenUtil.isLogin(token)) {
            return true;
        }

        // =========================================================================================================
        // ============================================如果已被踢出就返回信息============================================
        // =========================================================================================================
        /**
        * 判断是否已经踢出
        */
        if (token.getStatusKickout()) {
            TokenUtil.logoutSimple(token);
            throw new TransException(TransErrorCode.USER_KICKED_OUT);
        }

        return true;
    }

}